package com.shanjupay.merchant.service;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.shanjupay.common.domain.BusinessException;
import com.shanjupay.common.domain.CommonErrorCode;
import com.shanjupay.merchant.api.AppService;
import com.shanjupay.merchant.api.dto.AppDTO;
import com.shanjupay.merchant.convert.AppCovert;
import com.shanjupay.merchant.entity.App;
import com.shanjupay.merchant.entity.Merchant;
import com.shanjupay.merchant.mapper.AppMapper;
import com.shanjupay.merchant.mapper.MerchantMapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.UUID;

/*
* 暴露dubbo接口提供应用
*
* */
@Service
public class AppServiceImpl  implements AppService {
    /*
    * 商户创建应用
    * merchantId参数：指定具体用户
    * appDTO参数：指定创建应用提交的信息
    * */

    //注入AppMapper操作App表，把应用的App实体信息入库
    @Autowired
    AppMapper appMapper;

    //自动注入merchantMapper 操作商户表 根据商户id 查询是否存在该用户
    @Autowired
    MerchantMapper merchantMapper;

    @Override
    public AppDTO createApp(Long merchantId, AppDTO appDTO) throws BusinessException {
        /*
        * 参数校验
        * 商户传递过来的merchantId appDTO appName不为空校验
        * 1校验商户是否存在
        *2校验商户审核状态是否为2
        * 3校验应用名是否唯一性
        * */
        Merchant merchant = merchantMapper.selectById(merchantId);
        if(merchantId == null || appDTO == null || StringUtils.isBlank(appDTO.getAppName()) ){
            //抛出输入参数不为空
            throw new BusinessException(CommonErrorCode.E_300009);
        }
        //1校验用户是否存在
        if(merchant == null){
            throw new  BusinessException(CommonErrorCode.E_200002);
        }
        //2校验商户的审核状态是否为2 不为2审核不通过
        if(!"2".equals(merchant.getAuditStatus())){
            throw new BusinessException(CommonErrorCode.E_200003);
        }

        //3校验应用名是否唯一性
        if(isExistAppName(appDTO.getAppName())){
            throw new BusinessException(CommonErrorCode.E_200004);
        }
        //保持应用信息到应用app表
        //1 appDTO设置商户merchantId 和 应用appId
        appDTO.setAppId(UUID.randomUUID().toString());
        appDTO.setMerchantId(merchantId);
        //2DTO转化entity entity保持数据库中
        App app = AppCovert.INSTANCE.dtoToEntity(appDTO);
        appMapper.insert(app);
        //返回创建应用成功AppDTO 里面必须有该应用主键 创建应用成功后 mybatisPlus自动帮我们生成id
        //应用是否创建成功 ，entity看是否有id entity的主键id设置到dto 可以直接转化
        return AppCovert.INSTANCE.entityToDto(app);
    }

    @Override
    public List<AppDTO> queryAppByMerchant(Long merchantId) throws BusinessException {
        //根据merchantId进行查询应用列表
        List<App> apps = appMapper.selectList(new LambdaQueryWrapper<App>().eq(App::getMerchantId, merchantId));
        //使用mapstrut 把查询到List<app>强转成list<appDTO>
        List<AppDTO> appDTOS = AppCovert.INSTANCE.listentity2dto(apps);
        return appDTOS;
    }

    @Override
    public AppDTO getAppById(String appId) throws BusinessException {
        //根据appId条件进行查询单条记录
        App app = appMapper.selectOne(new QueryWrapper<App>().lambda().eq(App::getAppId, appId));
        //进行强转成appDTO
        return AppCovert.INSTANCE.entityToDto(app);
    }

    /*
    *
    * 查询某个应用是否输入某个商户
    *
    * */
    @Override
    public Boolean queryAppInMerchant(String appId, Long merchantId) {
        //根据商户id和应用id进行查询app表是否存在该记录
        Integer count = appMapper.selectCount(new LambdaQueryWrapper<App>().eq(App::getAppId, appId)
                .eq(App::getMerchantId, merchantId));

        return count > 0;
    }

    //判断应用是否存在的私有方法
    private Boolean isExistAppName(String appName){
        //1根据应用表app表中根据应用名查询是否有这个应用app 查询到总数大于0 已经存在该应用
        Integer count = appMapper.selectCount(new LambdaQueryWrapper<App>().eq(App::getAppName, appName));
        return count > 0;


    }

}
